program principal
interface

function funcion(x)result(res1)
	real(Kind=8),intent(in)::x
	real(kind=8)::res1
end function

subroutine trapecioCompuesto(inter,integ,a,b)
	real(kind=8)::a,b,valora,valorb,integ
	integer::inter
end subroutine

subroutine simpsonCompuesto(inter,integ,a,b)
	real(kind=8)::a,b,valora,valorb,valorc,integ
	integer::inter
end subroutine


function trapecio(a,b,valora,valorb)result(res3)
	real(kind=8)::a,b,valora,valorb,res3
end function

function simpson(a,b,valora,valorc,valorb)result(res4)
	real(kind=8)::a,b,valora,valorb,valorc,res4
end function


end interface
real(kind=8)::a,b,c,h,integ
integer::inter

print*,'¿cual es el intervalo de partida?'
		read(5,*)a
		read(5,*)b
print*,'¿cuantos intervalos?'
		read(5,*)inter
	c=a
	h=b
	call trapecioCompuesto(inter,integ,a,b)
	print*,'trapC',integ

	call simpsonCompuesto(inter,integ,c,h)
	print*,'simpC',integ

end program


function funcion(x)result(res1)
	real(Kind=8),intent(in)::x
	real(kind=8)::res1

	res1=2._8**x-5._8
end function


subroutine trapecioCompuesto(inter,integ,a,b)
	real(kind=8)::a,b,valora,valorb,integ,d
	integer::inter,i
	integ=0._8
	d=(b-a)/inter
	do i=1,inter,1
		valora=funcion(a)
		b=a+d
		valorb=funcion(b)
		integ=integ +trapecio(a,b,valora,valorb)
		a=b
	end do
end subroutine

subroutine simpsonCompuesto(inter,integ,a,b)
	real(kind=8)::a,b,valora,valorb,valorc,integ,d
	integer::inter,i
	integ=0._8
	d=(b-a)/inter
	do i=1,inter,1
		valora=funcion(a)
		b=a+d
		valorb=funcion(b)
		valorc=funcion((a+b)*0.5_8)
		integ=integ +simpson(a,b,valora,valorc,valorb)
		a=b
	end do
end subroutine


function trapecio(a,b,valora,valorb)result(res3)
	real(kind=8)::a,b,valora,valorb,res3
	res3=((b-a)*0.5_8)*(valora+valorb)
end function

function simpson(a,b,valora,valorc,valorb)result(res4)
	real(kind=8)::a,b,valora,valorb,valorc,res4

	res4=((b-a)/6._8)*(valora+(4._8*valorc)+valorb)
end function
